package com.jr.controller;
import com.google.gson.Gson;
import com.jr.pojo.ProjectInfo;
import com.jr.service.IProjectInfoService;
import com.jr.service.impl.ProjectInfoServiceImpl;
import com.jr.util.PageHelper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * WebServlet注解：将该Servlet映射到URL模式"/projectInfo/*"
 * 参数含义：
 * - "/projectInfo/*"：匹配所有以/projectInfo/开头的URL
 * - * 表示通配符，可以匹配任意路径
 */
@WebServlet("/projectInfo/*")
public class ProjectInfoController extends HttpServlet {

    // 创建项目信息服务实例
    private IProjectInfoService ips = new ProjectInfoServiceImpl();

    /**
     * service方法：处理所有HTTP请求的入口点
     * 参数含义：
     * - HttpServletRequest request：包含客户端请求信息（参数、头信息等）
     * - HttpServletResponse response：用于向客户端发送响应
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求的URI（例如：/projectInfo/showdt）
        String requestURI = request.getRequestURI();

        // 找到最后一个"/"的位置并加1，得到方法名的起始索引
        int index = requestURI.lastIndexOf("/") + 1;

        // 从URI中提取方法名（例如：showdt）
        String mName = requestURI.substring(index);

        // 如果方法名为空，设置默认方法为"showdt"
        if (mName.length() == 0) {
            mName = "showdt";
        }

        // 获取当前类的Class对象
        Class<ProjectInfoController> cla = ProjectInfoController.class;
        Method method = null;

        try {
            // 通过反射获取对应的方法
            // 参数含义：
            // - mName：方法名
            // - HttpServletRequest.class：方法第一个参数类型
            // - HttpServletResponse.class：方法第二个参数类型
            method = cla.getMethod(mName, HttpServletRequest.class, HttpServletResponse.class);

            // 调用找到的方法
            // 参数含义：
            // - this：调用方法的对象（当前Controller实例）
            // - request：HTTP请求对象
            // - response：HTTP响应对象
            method.invoke(this, request, response);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    /**
     * showdt方法：显示数据表格（分页查询）
     * 参数含义：
     * - request：包含查询参数（status-状态，indexpage-页码）
     * - response：用于返回JSON格式的数据
     */
    public void showdt(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型为JSON，字符编码为UTF-8
        response.setContentType("application/json;charset=utf-8");

        // 获取状态参数
        String status = request.getParameter("status");
        int proStatus = 0;

        // 处理状态参数：如果为空则设为-1（查询所有状态）
        if (status == null) {
            proStatus = -1;
        } else {
            proStatus = Integer.parseInt(status);
        }

        // 创建分页助手对象
        PageHelper ph = new PageHelper();

        // 查询指定状态的数据总数
        ph.setDateCount(ips.queryDataCount(proStatus));

        // 获取页码参数
        String indexpage = request.getParameter("indexpage");
        if (indexpage == null) {
            ph.setPageIndex(1); // 默认第一页
        } else {
            ph.setPageIndex(Integer.parseInt(indexpage)); // 设置指定页码
        }

        // 分页查询项目信息
        ArrayList<ProjectInfo> projectInfos = ips.queryByStatus(proStatus, ph);
        // 将查询结果设置到分页对象中
        ph.setListIndex(projectInfos);

        // 将分页对象转换为JSON并返回给客户端
        response.getWriter().println(new Gson().toJson(ph));
    }

    /**
     * queryByPid方法：根据项目ID查询项目详情
     * 参数含义：
     * - request：包含pid参数（项目ID）
     * - response：返回项目信息的JSON数据
     */
    public void queryByPid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("application/json;charset=utf-8");

        // 获取项目ID参数并转换为整数
        int pid = Integer.parseInt(request.getParameter("pid"));

        // 根据ID查询项目信息
        ProjectInfo projectInfo = ips.queryByPid(pid);

        // 将项目信息转换为JSON并返回
        response.getWriter().println(new Gson().toJson(projectInfo));
    }

    /**
     * updatePro方法：更新项目状态
     * 参数含义：
     * - request：包含status（新状态）和pid（项目ID）参数
     * - response：返回更新结果的JSON（true/false）
     */
    public void updatePro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取状态参数
        int status = Integer.parseInt(request.getParameter("status"));

        // 获取项目ID参数
        int pid = Integer.parseInt(request.getParameter("pid"));

        // 创建项目信息对象并设置属性
        ProjectInfo pro = new ProjectInfo();
        pro.setPid(pid);
        pro.setStatus(status);

        // 更新项目信息
        boolean b = ips.updateProject(pro);

        // 返回更新结果
        response.getWriter().println(new Gson().toJson(b));
    }
}